package com.xxl.job.admin.dto;


import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.TypeReference;
import com.xxl.job.admin.constant.BizCodeEnum;
import com.xxl.job.core.biz.model.ReturnT;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

/**
 * 小滴课堂,愿景：让技术不再难学
 *
 * @Description
 * @Author 二当家小D
 * @Remark 有问题直接联系我，源码-笔记-技术交流群
 * @Version 1.0
 **/

@Data
@AllArgsConstructor
@NoArgsConstructor
public class JsonData {

    /**
     * 状态码 0 表示成功
     */

    private Integer code;
    /**
     * 数据
     */
    private Object data;
    /**
     * 描述
     */
    private String msg;


    /**
     * 获取远程调用数据
     * 注意事项：
     * 支持多单词下划线专驼峰（序列化和反序列化）
     *
     * @param typeReference
     * @param <T>
     * @return
     */
    public <T> T getData(TypeReference<T> typeReference) {
        return JSON.parseObject(JSON.toJSONString(data), typeReference);
    }

    /**
     * 成功，不传入数据
     *
     * @return
     */
    public static JsonData buildSuccess() {
        BizCodeEnum success = BizCodeEnum.SUCCESS;
        return new JsonData(success.getCode(), null, success.getMessage());
    }

    /**
     * 成功，传入数据
     *
     * @param data
     * @return
     */
    public static JsonData buildSuccess(Object data) {
        BizCodeEnum success = BizCodeEnum.SUCCESS;
        return new JsonData(success.getCode(), data, success.getMessage());
    }

    /**
     * 失败，传入描述信息
     *
     * @param msg
     * @return
     */
    public static JsonData buildError(String msg) {
        BizCodeEnum commonFail = BizCodeEnum.COMMON_FAIL;
        return new JsonData(commonFail.getCode(), null, msg);
    }


    /**
     * 自定义状态码和错误信息
     *
     * @param code
     * @param msg
     * @return
     */
    public static JsonData buildCodeAndMsg(int code, String msg) {
        return new JsonData(code, null, msg);
    }

    /**
     * 传入枚举，返回信息
     *
     * @param codeEnum
     * @return
     */
    public static JsonData buildResult(BizCodeEnum codeEnum) {
        return JsonData.buildCodeAndMsg(codeEnum.getCode(), codeEnum.getMessage());
    }

    public static JsonData buildFromReturnT(ReturnT returnT) {
        Integer code = returnT.getCode() == 200 ? 0 : returnT.getCode();
        return new JsonData(code, returnT.getContent(), returnT.getMsg());
    }

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @Builder
    public static class PageData<T> {

        private List<T> records;

        private Object exData;
        /**
         * 总记录数
         */
        private Integer totalRecords;
        /**
         * 当前页面记录数
         */
        private Integer currentRecords;
        /**
         * 总页数
         */
        private Integer totalPages;
        /**
         * 当前页数
         */
        private Integer currentPage;

    }
}
